package com.ydlclass.config;

import com.ydlclass.IdGenerator;
import com.ydlclass.RegistryConfig;
import com.ydlclass.core.RateLimiter;
import com.ydlclass.core.TokenBuketRateLimiter;
import com.ydlclass.loadbalancer.LoadBalance;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.net.InetSocketAddress;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 配置参数
 * 全局的配置类，代码配置--> xml配置 -->默认项
 * @Author duWenJian
 * @Date 2024/3/1 13:43
 * @Version 1.0
 */
@Slf4j
@Data
public class Configuration {
    /**
     * 配置信息 --> 端口号
     */
    private int port = 8091;

    /**
     * 配置信息 --> 应用程序的名字
     */
    private String appName = "default";

    /**
     * 配置信息 --> 注册中心
     */
    private RegistryConfig registryConfig = new RegistryConfig("zookeeper://127.0.0.1:2181");

    /**
     * 配置信息 --> 全局id生成器
     */
    private IdGenerator idGenerator = new IdGenerator(1,2);

    /**
     * 配置信息 --> 负载均衡策略
     */
    private LoadBalance loadBalance;
    /**
     * 配置信息 --> 序列化协议
     */
    private String serializerType = null;
    /**
     * 配置信息 --> 压缩使用的协议
     */
    private String compressionType = "gzip";
    /**
     * 为每一个ip配置一个限流器
     */
    private Map<InetSocketAddress, RateLimiter> EVERY_IP_RATELimiter = new ConcurrentHashMap<>(8);
    /**
     * 配置分组名称
     */
    private String group = "default";


    /**
     * 我们使用原生的api来进行解析xml
     */
    public Configuration() {
        // 1、 成员变量的默认配置项
        // 2、 spi机制配置项
        SpiResolver spiResolver = new SpiResolver();
        spiResolver.loadFromSpi(this);

        // 3、 读取xml文件中的配置信息
        XmlResolver xmlResolver = new XmlResolver();
        xmlResolver.loadFromXml(this);

        // 4、变成配置项yrpcBootStrap来提供
        System.out.println("配置信息：" + this);
    }

    public static void main(String[] args) {
        Configuration configuration = new Configuration();
    }
}
